package com.thinkcar.mybatis.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.thinkcar.mybatis.Constants.CommonConstants;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * @author: jiangyong
 * @date: 2025/10/18
 * @description: MybatisPlusMetaObjectHandler
 */
@Component
public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {

    /**
     * 插入时自动填充字段
     *
     * @param metaObject 元对象，用于操作实体类属性
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        LocalDateTime now = LocalDateTime.now();
        // 推荐方案：使用 strictInsertFill 方法，类型安全
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, now);
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, now);

        // 设置创建人和更新人（以使用 ThreadLocal 的方案为例）
        String currentUser = getCurrentUser(); // 获取当前用户名
        this.strictInsertFill(metaObject, "createBy", String.class, currentUser);
        this.strictInsertFill(metaObject, "updateBy", String.class, currentUser);
        // 删除标记自动填充
        this.strictInsertFill(metaObject, "delFlag", String.class, CommonConstants.STATUS_NORMAL);
    }

    /**
     * 更新时自动填充字段
     *
     * @param metaObject 元对象
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        // 更新时，设置更新时间
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
        // 设置更新人
        String currentUser = getCurrentUser(); // 获取当前用户名
        this.strictUpdateFill(metaObject, "updateBy", String.class, currentUser);
    }

    /**
     * 获取当前用户名（此处需要根据你的安全框架或上下文获取）
     * 这里是一个示例，你需要替换为实际的获取逻辑
     */
    private String getCurrentUser() {
        // 示例：从ThreadLocal、SecurityContext等获取
        // 例如：return SecurityContextHolder.getContext().getAuthentication().getName();
        // 或者在用户登录后，将用户信息存入ThreadLocal，这里从ThreadLocal获取
        return "system"; // 示例返回值
    }

}
